package com.erbao.datastructurearithmetic.tyro;

import java.util.Arrays;

/**
 * @author CaoBaoYin
 * @since 21/7/22 20:48
 */
public class Class1 {

    public static void main(String[] args) {
        // printBinary(Integer.MAX_VALUE);

        /*long result = factorial(1);
        System.out.println(result);*/

        // System.out.println(factorialSum(5));

        int[] arr = {7,5,0,9,4,2,3,8,6};
        // selectSort (arr);
        // bubbleSort(arr);
        // insertSort(arr);
        // Arrays.stream(arr).forEach(System.out::print);

        
    }

    /**
     * 验证数组是升序的
     */
    public static boolean isSort(int[] arr) {
        if (arr == null) return false;
        int length = arr.length;
        if (length < 2) return true;
        for (int i = 1; i < length; i++) {
            if (arr[i] < arr[i-1]) return false;
        }
        return true;

    }

    /**
     * 插入排序
     */
    private static void insertSort(int[] arr) {
        if (arr==null || arr.length < 2) {
            return;
        }

        int n = arr.length;
        for (int i = 1; i < n; i++) {
            // 三种实现方式
            /*for (int j = i; j >0 ; j--) {
                if (arr[j-1] > arr[j]) {
                    swap(arr, j-1, j);
                } else {
                    break;
                }
            }*/
            /*int j = i;
            while (j > 0 && arr[j-1] > arr[j]) {
                swap(arr, j -1, j);
                j--;
            }*/
            for (int pre = i-1; pre>=0 && arr[pre]>arr[pre+1] ; pre--) {
                swap(arr, pre, pre+1);
            }
        }
    }

    /**
     * 冒泡排序
     */
    private static void bubbleSort(int[] arr) {
        if (arr==null || arr.length < 2) {
            return;
        }

        int n = arr.length;
        for (int i = n-1; i > 0 ; i--) {
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j+1]) swap(arr, j, j+1);
            }
        }
    }

    /**
     * 选择排序
     */
    public static void selectSort(int[] arr) {
        if (arr==null || arr.length == 1) {
            return;
        }

        int n = arr.length;
        for (int i = 0; i < n; i++) {
            for (int j = i+1; j < n; j++) {
                if (arr[i] > arr[j]) {
                    swap(arr, i , j);
                }
            }
        }
    }

    /**
     * 交换数组
     */
    public static void swap(int[] arr, int i, int j) {
        if (i == j) return;

        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    private static long factorialSum(int n) {
        if (n == 1) return 1;

        long result = 1L;
        long temp = 1;
        for (int i = 2; i <= n; i++) {
            temp *= i;
            result += temp;
        }
        return result;
    }


    /**
     * 求一个整数的阶乘
     */
    private static long factorial(int n) {
        long result = 1;
        for (int i = 1; i <= n; i++) {
            result *= i;
        }
        return result;
    }

    /**
     * 整型数计算机中占四个节点，每个字节八位，共占32位
     * 计算机中都是二进制存储
     * 只要把计算机中的存储显示出来即可
     * 计算机中运算都是操作二进制
     *
     * 代码中的每一位都跟1与运算就能原样输出计算机的二进制表示的整数
     * 1&1=1
     * 1&0=0
     * 0&1=0
     * 0&0=0
     *
     * 注意：1 & 2 = 0 并非1跟谁进行&运算就等谁 01 & 10 = 00 所以等0 要有计算机思维
     * @param num 整型数
     *
     */
    private static void printBinary(int num) {
        // 打印需要从左往右 1 左移31位
        for (int i = 31; i >= 0; i--) {
            System.out.print( (1<<i & num) == 0 ? "0" : "1" );
        }
        System.out.println();
    }

    public static void show (int[] arr) {
        Arrays.stream(arr).forEach(item -> System.out.print(item + ", "));
        System.out.println();
    }

}
